package justweb

// 树节点接口，允许自定义路由规则，支持扩展
// 用户是实现了这个接口就能够扩展树结构

type BaseNode interface {
	NewChildren([]string, HandlerFunc) (BaseNode, error)
	FindChildNode(string, *Context) (BaseNode, bool)
	FindRouter(string, *Context) (HandlerFunc, bool)
}

// 验证接口实现
var _ BaseNode = &treenode{}

// 框架使用者自己实现这个方法，然后传参给NewNode
// 注意没有命中的时候，返回nil，然后会自动调用默认的处理方法
type NewNodeFunc func(string) BaseNode

func NewNode(path string, f ...NewNodeFunc) BaseNode {
	var res BaseNode

	// 迭代框架使用者自己定义的方法--命中了就返回
	for _, o := range f {
		res = o(path) // 为path查找属于哪种node，找得到就返回对应的node，找不到就返回nil
		if res != nil {
			return res
		}
	}

	// 到了这里就表示自定义的方法都没有检测到，需要使用默认的了。
	// return default_newNode(path)默认的规则还是作为参数调用好一点
	return nil
}

// 使用默认的treenode结构，只传入对应的方法和
func NewNodeWithMatch(f MatchFunc, nodetype int, path string) BaseNode {
	return &treenode{
		ChildNodes: make([]*treenode, 0, 1),
		matchChild: f,
		nodeType:   nodetype,
		path:       path,
	}
}

// ==使用NewNodeFunc例子：==
// example 使用默认的treenode结构
// func NewTestAdd(path string) BaseNode {
// 	if true {
// 		// 找到解析的条件eg： if path == "*" {
// 		return NewNodeWithMatch(
// 			func(path string, c *Context) bool { return true },
// 			4,
// 			path,
// 		)
// 	} else {
// 		// 找不到条件
// 		return nil
// 	}
// }
// var t = NewNode("",NewTestAdd)

// example 不使用默认的treenode
// func NewTestAdd2(path string ) BaseNode {
// 	// if{}else{}
// 	return &treenode{}
// }
// var t = NewNode("",NewTestAdd2)
